import {
  Entity,
  Column,
  ManyToOne,
  JoinColumn,
  Index,
  BeforeInsert,
  BeforeUpdate,
  PrimaryGeneratedColumn
} from 'typeorm';
import { Seller } from './seller.entity';

/**
 * 定义球杆编号的状态
 * - AVAILABLE: 可用（未分配）
 * - ASSIGNED: 已分配（给经销商，但未使用）
 * - LOCKED: 已锁定（已用于订单）
 */
export enum NumStatus {
  /** 可用（未分配） */
  AVAILABLE = '0',
  /** 已分配（给经销商，但未使用） */
  ASSIGNED = '1',
  /** 已锁定（已用于订单） */
  LOCKED = '2',
  /** 已完成（已用于订单，且订单已完成） */
  FINISHED = '3'
}

@Entity('tb_number')
export class NumEntity {
  /**
   * 主键ID
   * @description 自增主键，用于唯一标识每个编号记录。
   */
  @PrimaryGeneratedColumn('increment', {
    comment: '主键ID，自增'
  })
  id: number;

  /**
   * 球杆编号，全局唯一
   * @description 作为表的主键，确保每个编号的唯一性。
   */
  @Column({
    length: 50,
    comment: '球杆编号，全局唯一'
  })
  num: string;

  /**
   * 编号状态
   * @description 用于追踪编号的生命周期：可用、已分配、已锁定。
   */
  @Column({
    type: 'enum',
    enum: NumStatus,
    default: NumStatus.AVAILABLE,
    comment: '编号状态：available, assigned, locked, finished'
  })
  @Index()
  status: NumStatus;

  /**
   * 关联的经销商实体
   * @description 通过 ManyToOne 关系，方便进行对象关系映射查询。
   */
  @ManyToOne(() => Seller)
  @JoinColumn({ name: 'seller_id' })
  seller: Seller;

  /**
   * 关联的订单ID
   * @description 当状态为 'locked' 时，记录对应的订单ID。
   */
  @Column({ type: 'bigint', nullable: true, comment: '关联的订单ID' })
  order_id?: number;

  /**
   * 记录创建时间
   * @description 13位时间戳（毫秒）。
   */
  @Column({
    type: 'bigint',
    comment: '记录创建时间，13位时间戳（毫秒）'
  })
  create_at: number;

  /**
   * 记录最后更新时间
   * @description 13位时间戳（毫秒）。
   */
  @Column({
    type: 'bigint',
    comment: '记录最后更新时间，13位时间戳（毫秒）'
  })
  update_at: number;

  /**
   * 在插入数据库之前，自动设置创建和更新时间。
   */
  @BeforeInsert()
  beforeInsert() {
    this.create_at = Date.now();
    this.update_at = Date.now();
  }

  /**
   * 在更新数据库之前，自动设置更新时间。
   */
  @BeforeUpdate()
  beforeUpdate() {
    this.update_at = Date.now();
  }
}
